package management.system.view.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Hashtable;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import management.system.model.bean.DetalleUsuarioIdea;
import management.system.model.bean.GrupoDTO;
import management.system.model.bean.PerfilDTO;
import management.system.model.bean.UsuarioDTO;
import management.system.model.services.GrupoService;
import management.system.model.services.PerfilService;
import management.system.model.services.UsuarioService;
import management.system.utils.Constants;

/**
 * Servlet implementation class ServletUsuario
 */
@WebServlet("/usuario")
public class ServletUsuario extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServletUsuario() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String metodo = request.getParameter("metodo");
		System.out.println("metodo doGet:"+metodo);
		
		if(metodo.equals("INSERTA")){
			insertUsuario(request, response);
		}else if(metodo.equals("EDITA")){
			updateUsuario(request, response);
		}else if(metodo.equals("ELIMINA")){
			deleteUsuario(request, response);
		}else if(metodo.equals("BUSCA")){
			findUsuario(request, response);
		}else if(metodo.equals("ESCOGE")){
			buscaUsuario(request, response);
		}else if(metodo.equals("FILTRO")){
			filtoUsuario(request, response);
		}else if(metodo.equals("DOCENTE")){
			filtroDocente(request, response);
		}else if(metodo.equals("ELEGIRUSUARIO")){
			obtenerUsuario(request, response);
		}else if(metodo.equals("ELIMINAUSUARIO")){
			eliminaUsuario(request, response);
		}else if(metodo.equals("DETALLE")){
			detalleIdeaUsuario(request, response);
		}else if(metodo.equals("LIMPIAR")){
			limpiar(request, response);
		}else{
			listUsuario(request, response);
		}
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String metodo = request.getParameter("metodo");
		System.out.println("metodo doPost:"+metodo);
		
		if(metodo.equals("INSERTA")){
			insertUsuario(request, response);
		}else if(metodo.equals("EDITA")){
			updateUsuario(request, response);
		}else if(metodo.equals("ELIMINA")){
			deleteUsuario(request, response);
		}else if(metodo.equals("BUSCA")){
			findUsuario(request, response);
		}else if(metodo.equals("ESCOGE")){
			buscaUsuario(request, response);
		}else if(metodo.equals("FILTRO")){
			findUsuario(request, response);
		}else if(metodo.equals("DOCENTE")){
			filtroDocente(request, response);
		}else if(metodo.equals("ELEGIRUSUARIO")){
			obtenerUsuario(request, response);
		}else if(metodo.equals("ELIMINAUSUARIO")){
			eliminaUsuario(request, response);
		}else if(metodo.equals("DETALLE")){
			detalleIdeaUsuario(request, response);
		}else if(metodo.equals("LIMPIAR")){
			limpiar(request, response);
		}else{
			listUsuario(request, response);
		}
		
	}
	
	protected void insertUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		UsuarioDTO dto = new UsuarioDTO();
		
		PerfilService perfilService = new PerfilService();
		ArrayList<PerfilDTO> lstPerfiles = null;
		
		GrupoService grupoService= new GrupoService();
		ArrayList<GrupoDTO> lstGrupos = null;
		
		Integer result = null;


		
		try {
			//Esto sirve ingresar un nuevo usuario
			if(usuarioservice.getNumDocumento(request.getParameter("txtNumeroIdentidad")).intValue() > 0){
				Constants.VALIDATE = 1;
				lstPerfiles = perfilService.listPerfil("");
				lstGrupos = grupoService.listGrupo();
				request.setAttribute("perfiles", lstPerfiles);
				request.setAttribute("grupos", lstGrupos);
				RequestDispatcher rd =
						getServletContext().
						getRequestDispatcher("/jsp/nuevoUsuario.jsp");
						rd.forward(request, response);
			}else if(usuarioservice.getEmailUsuario(request.getParameter("txtEmail").trim()).intValue() > 0){
				Constants.VALIDATE = 2;
				lstPerfiles = perfilService.listPerfil("");
				lstGrupos = grupoService.listGrupo();
				request.setAttribute("perfiles", lstPerfiles);
				request.setAttribute("grupos", lstGrupos);
				RequestDispatcher rd =
						getServletContext().
						getRequestDispatcher("/jsp/nuevoUsuario.jsp");
						rd.forward(request, response);
			}else{
				dto.setPerfilId(Integer.parseInt(request.getParameter("cboPerfil")));
				dto.setNombres(request.getParameter("txtNombre"));
				dto.setApellidoPaterno(request.getParameter("txtPaterno"));
				dto.setApellidoMaterno(request.getParameter("txtMaterno"));
				dto.setEmail(request.getParameter("txtEmail"));
				dto.setClave(request.getParameter("txtClave"));
				dto.setSexo(request.getParameter("rbtSexo"));
				SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
				Date parse = format.parse(request.getParameter("txtFechaNacimiento"));
				dto.setFechaNacimiento(new java.sql.Date(parse.getTime()));
				dto.setCelular(request.getParameter("txtCelular"));
				dto.setDocumentoId(Integer.parseInt(request.getParameter("cboDocumentoIdentidad")));
				dto.setNumeroDocumento(request.getParameter("txtNumeroIdentidad"));
				dto.setGrupoId(Integer.parseInt(request.getParameter("cboGrupo")));
				
				result = usuarioservice.insertUsuario(dto);
				
				if(result>0){
					Constants.VALIDATE = 0;
					listUsuario(request, response);
				}
			}
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	protected void updateUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		UsuarioDTO dto = new UsuarioDTO();
		
		
		Integer result = null;


		
		try {
			//Esto sirve ingresar un nuevo usuario
			
				dto.setUsuarioId(Integer.parseInt(request.getParameter("codigo")));
				dto.setPerfilId(Integer.parseInt(request.getParameter("cboPerfil")));
				dto.setNombres(request.getParameter("txtNombre"));
				dto.setApellidoPaterno(request.getParameter("txtPaterno"));
				dto.setApellidoMaterno(request.getParameter("txtMaterno"));
				dto.setEmail(request.getParameter("txtEmail"));
				dto.setClave(request.getParameter("txtClave"));
				dto.setSexo(request.getParameter("rbtSexo"));
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
				Date parse = format.parse(request.getParameter("txtFechaNacimiento"));
				dto.setFechaNacimiento(new java.sql.Date(parse.getTime()));
				dto.setCelular(request.getParameter("txtCelular"));
				dto.setDocumentoId(Integer.parseInt(request.getParameter("cboDocumentoIdentidad")));
				dto.setNumeroDocumento(request.getParameter("txtNumeroIdentidad"));
				dto.setGrupoId(Integer.parseInt(request.getParameter("cboGrupo")));
				
				result = usuarioservice.updateUsuario(dto);
				
				if(result>0){
					listUsuario(request, response);
				}
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
	}
	
	protected void deleteUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		
		Integer result = null;
		Integer id = 
				Integer.parseInt(request.getParameter("cod"));

		try {
			result = usuarioservice.deleteUsuario(id);
			if(result>0)
				listUsuario(request, response);
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
	}
	
	protected void findUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		UsuarioDTO dto = null;
		
		PerfilService perfilService = new PerfilService();
		ArrayList<PerfilDTO> lstPerfiles = null;
		
		GrupoService grupoService= new GrupoService();
		ArrayList<GrupoDTO> lstGrupos = null;
		
		
		Integer id = 
				Integer.parseInt(request.getParameter("cod"));
		
		try {
			lstPerfiles = perfilService.listPerfil("");
			lstGrupos = grupoService.listGrupo();
			dto = usuarioservice.getUsuarioById(id);
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		request.setAttribute("perfiles", lstPerfiles);
		request.setAttribute("grupos", lstGrupos);
		request.setAttribute("bean", dto);
		
		RequestDispatcher rd =
				getServletContext().
				getRequestDispatcher("/jsp/editaUsuario.jsp");
			rd.forward(request, response);

	}

	protected void buscaUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		UsuarioDTO dto = null;
		
		
		
		Integer id = 
				Integer.parseInt(request.getParameter("codigo"));
		
		try {
			dto = usuarioservice.getUsuarioById(id);
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		HttpSession session = request.getSession(false);
		session.setAttribute("codigoUsuario", dto.getUsuarioId());
		session.setAttribute("nombreUsuario", dto.getNombres());
		session.setAttribute("apellidoPaterno", dto.getApellidoPaterno());
		session.setAttribute("apellidoMaterno", dto.getApellidoMaterno());
		session.setAttribute("emailUsuario", dto.getEmail());
		session.setAttribute("celularUsuario", dto.getCelular());
		session.setAttribute("documentoId", dto.getDocumentoId());
		session.setAttribute("numDocumento", dto.getCelular());

			
		response.sendRedirect("jsp/publicarIdea.jsp");

	}

	
	protected void filtoUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		ArrayList<UsuarioDTO> lstUsuarios = null;
		
		String filtro = null;
		 filtro = request.getParameter("txtFiltro");
		 System.out.println("Parameter:"+filtro);
		try {
			if(filtro!=null){
				lstUsuarios = usuarioservice.listUsuarios(filtro);
			}else{
				lstUsuarios = usuarioservice.listUsuarios("");
			}
			
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		HttpSession session = request.getSession();
		
		session.setAttribute("data", lstUsuarios);
			

		RequestDispatcher rd =
		getServletContext().
		getRequestDispatcher("/jsp/buscarUsuarios.jsp");
		rd.forward(request, response);
		
	}

	protected void filtroDocente(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		ArrayList<UsuarioDTO> lstDocentes = null;
		

		try {

			lstDocentes = usuarioservice.listDocentes();

			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		

		request.setAttribute("docentes", lstDocentes);

		RequestDispatcher rd =
		getServletContext().
		getRequestDispatcher("/jsp/evaluarIdea.jsp");
		rd.forward(request, response);
		

		
	}

	
	protected void listUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		ArrayList<UsuarioDTO> lstUsuarios = null;
		
		String filtro = null;
		 filtro = request.getParameter("txtFiltro");
		 System.out.println("Parameter:"+filtro);
		try {
			if(filtro!=null){
				lstUsuarios = usuarioservice.listUsuarios(filtro);
			}else{
				lstUsuarios = usuarioservice.listUsuarios("");
			}
			
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		HttpSession session = request.getSession();
		
		session.setAttribute("data", lstUsuarios);
			
		RequestDispatcher rd =
		getServletContext().
		getRequestDispatcher("/jsp/listarUsuarios.jsp");
		rd.forward(request, response);
		
	}
	
	protected void obtenerUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		
		UsuarioService usuarioservice = new UsuarioService();
		UsuarioDTO dto = null;
		
		HttpSession session = request.getSession(false);
		
		Hashtable<Integer, UsuarioDTO> usuario = (Hashtable<Integer, UsuarioDTO>) session
				.getAttribute("objUsuario");
		
		// Si no existe un cariro se crea uno
		if (usuario == null) {
			usuario = new Hashtable<Integer, UsuarioDTO>();
		}
		
		// Se recibe los parametros
		System.out.println("codigo usuario:"+request.getParameter("codigoUsuario"));
		System.out.println("nombre usuario:"+request.getParameter("txtNombre"));
		
		Integer codigo = Integer.parseInt(request
				.getParameter("codigoUsuario"));
		
		try {
			dto = usuarioservice.getUsuarioById(codigo);
			
			usuario.put(dto.getUsuarioId(), dto);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		session.setAttribute("objUsuario", usuario);
		
		Collection<UsuarioDTO> usuarios = usuario.values();
		session.setAttribute("detalleUsuario", usuarios);
		
		response.sendRedirect("jsp/publicarIdea.jsp");
		
		
	}

	
	protected void eliminaUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		
		UsuarioService usuarioservice = new UsuarioService();
		
		HttpSession session = request.getSession(false);
		
		Integer codigo = Integer.parseInt(request
				.getParameter("codigo"));

		Hashtable<Integer, UsuarioDTO> usuario = (Hashtable<Integer, UsuarioDTO>) session
				.getAttribute("objUsuario");

		if (codigo != null) {
			usuario.remove(codigo);

			session.setAttribute("objUsuario", usuario);
		}

		Collection<UsuarioDTO> usuarios = usuario.values();
		session.setAttribute("detalleUsuario", usuarios);

		response.sendRedirect("jsp/publicarIdea.jsp");
	}

	protected void detalleIdeaUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		UsuarioService usuarioservice = new UsuarioService();
		
		HttpSession session = request.getSession(false);
		
		Hashtable<String, UsuarioDTO> detalleIdeaUsuario = (Hashtable) session
				.getAttribute("objUsuario");
		Integer codigoIdea = (Integer) session
				.getAttribute("codigoIdea");
		
		DetalleUsuarioIdea dto = new DetalleUsuarioIdea();
		dto.setIdeaId(codigoIdea);
		
		try {
			usuarioservice.insertar(dto, detalleIdeaUsuario.values());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//Removemos las sesion Idea
		session.removeAttribute("codigoIdea");
		session.removeAttribute("titulo");
		session.removeAttribute("descipcion");
		session.removeAttribute("clave1");
		session.removeAttribute("clave2");
		session.removeAttribute("clave3");
		session.removeAttribute("clave4");
		
		//Removemos las sesion usuario
		session.removeAttribute("codigoUsuario");
		session.removeAttribute("nombreUsuario");
		session.removeAttribute("apellidoPaterno");
		session.removeAttribute("apellidoMaterno");
		session.removeAttribute("emailUsuario");
		session.removeAttribute("celularUsuario");
		session.removeAttribute("documentoId");	
		session.removeAttribute("numDocumento");	
		
		limpiar(request, response);
	}
	
	protected void limpiar(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
				
				HttpSession session = request.getSession();
				
				
				Hashtable<Integer, UsuarioDTO> usuario = (Hashtable<Integer, UsuarioDTO>) session
						.getAttribute("objUsuario");
				usuario.clear();

				response.sendRedirect("jsp/publicarIdea.jsp");
	}

}
